﻿#include<iostream>
#include<algorithm>
#include<string>
#include<vector>


/*
* 通常情况下我们把一个类型的对象赋值给另一个类型的指针或者引用时，存在类型转换，中间会产
* 生临时对象，所以需要加const，如： int a = 1; const double& d = a; public继承
* 中，就是一个特殊处理的例外，派生类对象 可以赋值给 基类的指针 / 基类的引用，而不需要加
* const，这里的指针和引用绑定是派生类对象中的基类部分
*/


class Person
{
	//protected:
public:
	std::string _name = "Null"; // 姓名
	std::string _sex; // 性别
	int _age = 18; // 年龄
};
class Student : public Person
{
public:
	int _No; // 学号
};

//int main()
//{
//	Student sobj;
//	// 1.派⽣类对象可以赋值给基类的指针/引⽤
//	Person* pp = &sobj;
//	Person& rp = sobj;
//	rp._name = "aaa";
//	// 通过调试窗口和代码补全都可以发现，这里的rp不包含 _No这个成员变量
//
//	// 派⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的
//	Person pobj = sobj;
//	//pobj._No = 12; //被切割了
//
//	//2.基类对象不能赋值给派⽣类对象，这⾥会编译报错
//	//sobj = pobj;
//
//	return 0;
//}

/*
* 派⽣类对象赋值给基类对象是通过基类的拷⻉构造函数或者赋值重载函数完成的(这两个函数的细节
* 后⾯⼩节会细讲)，这个过程就像派⽣类⾃⼰定义部分成员切掉了⼀样，所以也被叫做切割或者切
* ⽚
*/
